package pimmodel;

import static org.junit.Assert.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.ResourceBundle;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;


/**
 * Testklasse zur AufgabenList
 * @author Kevin
 *
 */
public class AufgabenListTest {

	IAufgabenList aufgabenliste1;
	IAufgabenList aufgabenliste2;

	ArrayList<IAufgabe> arrayList;

	IAufgabe aufgabe1;
	IAufgabe aufgabe2;
	IAufgabe aufgabe3;
	IAufgabe aufgabe4;
	IAufgabe aufgabe5;
	
	/**
	 * @param resourceBundle 
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		aufgabenliste1 = new AufgabenList();
		aufgabenliste2 = new AufgabenList();
		
		arrayList = new ArrayList<>();
		
		aufgabe1 = new Aufgabe("A", true, "x", false);
		aufgabe2 = new Aufgabe("B", true, "x", false);
		aufgabe3 = new Aufgabe("C", true, "x", false);
		aufgabe4 = new Aufgabe("D", true, "x", false);
		aufgabe5 = new Aufgabe("E", true, "x", false);
	}
	
	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#aufgabeHinzufuegen(pimmodel.IAufgabe)}.
	 */
	@Test
	public void testAufgabeHinzufuegen() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(3,aufgabenliste1.size());
		assertEquals(aufgabenliste1.getAufgabe(0), aufgabe1);
		assertEquals(aufgabenliste1.getAufgabe(1), aufgabe2);
		assertEquals(aufgabenliste1.getAufgabe(2), aufgabe3);
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#aufgabeLoeschen(pimmodel.IAufgabe)}.
	 */
	@Test
	public void testAufgabeLoeschen() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(3,aufgabenliste1.size());
		aufgabenliste1.aufgabeLoeschen(aufgabe2);
		assertEquals(aufgabenliste1.getAufgabe(0), aufgabe1);
		assertEquals(aufgabenliste1.getAufgabe(1), aufgabe3);
		aufgabenliste1.aufgabeLoeschen(aufgabe3);
		assertEquals(aufgabenliste1.getAufgabe(0), aufgabe1);
		aufgabenliste1.aufgabeLoeschen(aufgabe1);
		assertEquals(0,aufgabenliste1.size());
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#aufgabeBear(pimmodel.Aufgabe, pimmodel.IAufgabe)}.
	 */
	@Test
	public void testAufgabeBear() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeBear(aufgabe3, aufgabe1);
		assertEquals(aufgabenliste1.getAufgabe(0), aufgabe3);
		assertEquals(1,aufgabenliste1.size());
		
		try {
			aufgabenliste1.aufgabeBear(aufgabe5, aufgabe1);
			fail("Notiz-nicht-vorhanden-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException notizNull) {
		}
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#suchen(java.lang.String)}.
	 */
	@Test
	public void testSuchen() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(0, aufgabenliste1.suchen("A"));
		assertEquals(1, aufgabenliste1.suchen("B"));
		assertEquals(2, aufgabenliste1.suchen("C"));
		assertEquals(-1, aufgabenliste1.suchen("D"));
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#suchenAufgabe(pimmodel.IAufgabe)}.
	 */
	@Test
	public void testSuchenAufgabe() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(0, aufgabenliste1.suchenAufgabe(aufgabe1));
		assertEquals(1, aufgabenliste1.suchenAufgabe(aufgabe2));
		assertEquals(2, aufgabenliste1.suchenAufgabe(aufgabe3));
		assertEquals(-1, aufgabenliste1.suchenAufgabe(aufgabe4));
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#getAufgabe(int)}.
	 */
	@Test
	public void testGetAufgabe() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(aufgabenliste1.getAufgabe(0), aufgabe1);
		assertEquals(aufgabenliste1.getAufgabe(1), aufgabe2);
		assertEquals(aufgabenliste1.getAufgabe(2), aufgabe3);

		try {
			aufgabenliste1.getAufgabe(3);
			fail("Index-falsch-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException indexFalsch) {

		}

		try {
			aufgabenliste1.getAufgabe(-1);
			fail("Index-falsch-Ausnahme sollte geworfen worden sein");
		}
		catch (IllegalArgumentException indexFalsch) {

		}
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#sortieren()}.
	 */
	@Test
	public void testSortieren() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe5);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe4);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		assertEquals(aufgabe5, aufgabenliste1.getAufgabe(0));
		assertEquals(aufgabe4, aufgabenliste1.getAufgabe(1));
		assertEquals(aufgabe3, aufgabenliste1.getAufgabe(2));
		assertEquals(aufgabe2, aufgabenliste1.getAufgabe(3));
		assertEquals(aufgabe1, aufgabenliste1.getAufgabe(4));

		aufgabenliste1.sortieren();
		assertEquals(aufgabe1, aufgabenliste1.getAufgabe(0));
		assertEquals(aufgabe2, aufgabenliste1.getAufgabe(1));
		assertEquals(aufgabe3, aufgabenliste1.getAufgabe(2));
		assertEquals(aufgabe4, aufgabenliste1.getAufgabe(3));
		assertEquals(aufgabe5, aufgabenliste1.getAufgabe(4));

		aufgabenliste1.allesEntfernen();
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe4);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe5);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.sortieren();
		assertEquals(aufgabe1, aufgabenliste1.getAufgabe(0));
		assertEquals(aufgabe2, aufgabenliste1.getAufgabe(1));
		assertEquals(aufgabe3, aufgabenliste1.getAufgabe(2));
		assertEquals(aufgabe4, aufgabenliste1.getAufgabe(3));
		assertEquals(aufgabe5, aufgabenliste1.getAufgabe(4));

		aufgabenliste1.allesEntfernen();
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		assertEquals(aufgabe1, aufgabenliste1.getAufgabe(0));
		aufgabenliste1.sortieren();
		assertEquals(aufgabe1, aufgabenliste1.getAufgabe(0));
		assertEquals(1, aufgabenliste1.size());
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#getAufgabenliste()}.
	 */
	@Test
	public void testGetAufgabenliste() {
		arrayList.add(aufgabe1);
		arrayList.add(aufgabe2);
		arrayList.add(aufgabe3);

		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);

		assertEquals(arrayList, aufgabenliste1.getAufgabenliste());
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#setAufgabenliste(java.util.ArrayList)}.
	 */
	@Test
	public void testSetAufgabenliste() {
		arrayList.add(aufgabe1);
		arrayList.add(aufgabe2);
		arrayList.add(aufgabe3);

		assertEquals(0, aufgabenliste1.size());
		aufgabenliste1.setAufgabenliste(arrayList);
		assertEquals(3, aufgabenliste1.size());
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#size()}.
	 */
	@Test
	public void testSize() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(aufgabenliste1.size(), 3);
		aufgabenliste1.aufgabeLoeschen(aufgabe1);
		assertEquals(aufgabenliste1.size(), 2);
		aufgabenliste1.aufgabeLoeschen(aufgabe2);
		assertEquals(aufgabenliste1.size(), 1);
		aufgabenliste1.aufgabeLoeschen(aufgabe3);
		assertEquals(aufgabenliste1.size(), 0);
		aufgabenliste1.aufgabeLoeschen(aufgabe4);
		assertEquals(aufgabenliste1.size(), 0);
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#sucheKleinsteAufgabe(int)}.
	 */
	@Test
	public void testSucheKleinsteAufgabe() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe5);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe4);
		assertEquals(aufgabe1, aufgabenliste1.sucheKleinsteAufgabe(0));
		assertEquals(aufgabe4, aufgabenliste1.sucheKleinsteAufgabe(4));
		assertEquals(aufgabe4, aufgabenliste1.sucheKleinsteAufgabe(3));
		assertEquals(aufgabe2, aufgabenliste1.sucheKleinsteAufgabe(1));
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#vertauscheAufgaben(pimmodel.IAufgabe, pimmodel.IAufgabe)}.
	 */
	@Test
	public void testVertauscheAufgaben() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe4);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe5);
		aufgabenliste1.vertauscheAufgaben(aufgabe2, aufgabe4);
		aufgabenliste1.vertauscheAufgaben(aufgabe3, aufgabe5);
		assertEquals(aufgabe1, aufgabenliste1.getAufgabe(0));
		assertEquals(aufgabe4, aufgabenliste1.getAufgabe(1));
		assertEquals(aufgabe5, aufgabenliste1.getAufgabe(2));
		assertEquals(aufgabe2, aufgabenliste1.getAufgabe(3));
		assertEquals(aufgabe3, aufgabenliste1.getAufgabe(4));
	}

	/**
	 * Test method for {@link pimmodel.AufgabenList#allesEntfernen()}.
	 */
	@Test
	public void testAllesEntfernen() {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe5);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe4);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		assertEquals(aufgabenliste1.size(), 5);
		aufgabenliste1.allesEntfernen();
		assertEquals(aufgabenliste1.size(), 0);
	}

	@Test
	public void testSpeichernUndLaden() throws FileNotFoundException, IOException, ClassNotFoundException {
		aufgabenliste1.aufgabeHinzufuegen(aufgabe1);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe2);
		aufgabenliste1.aufgabeHinzufuegen(aufgabe3);
		assertEquals(3, aufgabenliste1.size());

		aufgabenliste2.aufgabeHinzufuegen(aufgabe4);
		aufgabenliste2.aufgabeHinzufuegen(aufgabe5);
		assertEquals(2, aufgabenliste2.size());

		aufgabenliste1.speichern();
		aufgabenliste2.laden();

		assertEquals(3, aufgabenliste2.size());
		assertEquals(aufgabe1, aufgabenliste2.getAufgabe(0));
		assertEquals(aufgabe2, aufgabenliste2.getAufgabe(1));
		assertEquals(aufgabe3, aufgabenliste2.getAufgabe(2));
	}
}